#pragma once

#include <iostream>
#include <pthread.h>

//使用类来封装互斥锁Mutex
class Mutex
{
public:
    Mutex(pthread_mutex_t* p_lock = nullptr)
        :_p_lock(p_lock)
    {}

    void lock()//加锁
    {
        if(_p_lock) pthread_mutex_lock(_p_lock);
    }

    void unlock()//解锁
    {
        if(_p_lock) pthread_mutex_unlock(_p_lock);
    }

    ~Mutex()
    {}
private:
    pthread_mutex_t *_p_lock;
};

class LockGuard//保卫锁
{
public:
    LockGuard(pthread_mutex_t * p_mutex)
        :_mutex(p_mutex)
    {
        _mutex.lock();//再构造函数进行加锁
    }

    ~LockGuard()
    {
        _mutex.unlock();//在析构函数进行解锁
    }

private:
    Mutex _mutex;
};

//相同效果，但不适合大型项目
// class LockGuard
// {
// public:
//     LockGuard(pthread_mutex_t* p_lock)
//         :_p_lock(p_lock)
//     {
//         if(_p_lock) pthread_mutex_lock(_p_lock);
//     }
//     ~LockGuard()
//     {
//         if(_p_lock) pthread_mutex_unlock(_p_lock);
//     }
// private:
//     pthread_mutex_t *_p_lock;
// };

// 第一种：
// Mutex类：专门负责互斥锁的基本操作

// LockGuard类：专门负责RAII生命周期管理

// 第二种：
// LockGuard类：既负责RAII管理，又直接操作底层锁API
